#!/bin/bash

# rpmbuild 的根目录
RPMBUILD_DIR="/home/openeuler/rpmbuild"  # 修改为您的 rpmbuild 路径
MAX_ATTEMPTS=360           # 最大循环次数
spec_bak_dir="/home/openeuler/rpmbuild/SPECS/spec_bak_dir" # spec文件备份地址
# 创建备份目录（如果不存在）
# mkdir -p "$spec_bak_dir"

# 切换到 rpmbuild 目录
cd "$RPMBUILD_DIR" || { echo "无法进入目录 $RPMBUILD_DIR"; exit 1; }

# 获取所有的 .spec 文件
spec_files=($(find SPECS -type f -name "*.spec"))

if [ ${#spec_files[@]} -eq 0 ]; then
    echo "未找到任何 .spec 文件，结束."
    exit 0
fi

# 使用数组来记录已成功打包的 .spec 文件
declare -a processed_files
# declare -a failed_files
# output_file="/root/output.txt"

last_failure_count=0  # 上次失败计数
current_failure_count=0  # 当前失败计数



# 循环尝试编译、打包和安装
for (( attempt=1; attempt <= MAX_ATTEMPTS; attempt++ )); do
    echo "===========第 $attempt 次循环开始================"

    current_failure_count=0  # 重置当前失败计数
    
	

    # 遍历每个 .spec 文件
    for spec_file in "${spec_files[@]}"; do
        # 检查是否已经处理过
        if [[ " ${processed_files[@]} " =~ " $(basename "$spec_file") " ]]; then
            mv "$spec_file" "$spec_bak_dir/" # 避免每次打断程序后又从头开始编译
            echo "移动文件 $spec_file 到备份目录，因为它与 $base_rpm 同名。"
            echo "将已成功处理的文件：$spec_file 移动到备份路径： $spec_bak_dir"
            continue
        fi

        echo "正在处理 $spec_file"

        # 进行打包
        if ! rpmbuild -ba "$spec_file"; then
            echo "编译失败：$spec_file"
            current_failure_count=$((current_failure_count + 1))  # 失败次数加一
            # failed_files+=("$(basename "$spec_file")")  # 添加到已处理列表
            
            # 检查缺少的依赖
            #missing_deps=$(grep 'error:' "$RPMBUILD_DIR"/RPMS/*/*.log | awk -F' ' '{ for (i=3; i<=NF; i++) printf "%s ", $i; print "" }' | sort -u)
            #if [ ! -z "$missing_deps" ]; then
             #   echo "缺少的依赖：$missing_deps"
             #   failed_files+=("$(basename "$missing_deps")")
            #fi
            echo "跳过 $spec_file，继续下一个文件..."
            continue  # 继续下一个 .spec 文件
        fi

     
        
        #if ! rpm -ivh "${RPMBUILD_DIR}/RPMS/x86_64/"*.rpm; then  # 根据您的架构选择
        #    echo "安装失败：$spec_file"
         #   current_failure_count=$((current_failure_count + 1))  # 失败次数加一
         #   echo "跳过 $spec_file，继续下一个文件..."
         #   continue
        #fi

        echo "$spec_file 编译成功!"
        processed_files+=("$(basename "$spec_file")")  # 添加到已处理列表
    done
    
    #=====一轮编译完成后，开始安装======
    # 安装包
    # 将上一轮生成的新的rpm复制到本地源
    source_dir="/root/rpmbuild/RPMS/x86_64"
    target_dir="/opt/localrepo"
    is_equal=0

    # 检查源文件夹和目标文件夹是否存在
    if [ ! -d "$source_dir" ]; then
        echo "源文件夹 $source_dir 不存在。请检查路径。"
        exit 1
    fi

    if [ ! -d "$target_dir" ]; then
        echo "目标文件夹 $target_dir 不存在。请检查路径。"
        exit 1
    fi

    # 遍历源文件夹中的所有文件
    for source_file in "$source_dir"/*; do
        # 获取文件名
	file_name=$(basename "$source_file")
	target_file="$target_dir/$file_name"
	
	# 检查目标文件是否存在
	if [ -e "$target_file" ]; then
	    # 比较源文件和目标文件
	    if ! cmp -s "$source_file" "$target_file"; then
	        echo "文件 $file_name 不同，正在复制到目标文件夹..."
	        is_equal=1
	    # echo "source_file: $source_file, target_file: $target_file"
                cp "$source_file" "$target_dir"
            fi
	else
	    echo "文件 $file_name 在目标文件夹中不存在，正在复制..."
	    is_equal=1
	    cp "$source_file" "$target_dir"
	fi
    done

    echo "RPM文件比较和复制过程完成。"
	
	
	if [ $is_equal -eq 0 ]; then
	    echo "没有新文件产生！"
	else
	    echo "有新文件产生！"
	    # 更新本地源
	    # sudo yum clean all
	    # sudo yum makecache
	fi


	# 指定包含 RPM 包的目录
	rpm_dir="/root/rpmbuild/RPMS/x86_64" # 替换为你的具体路径


	# 检查指定目录是否存在
	if [[ ! -d "$rpm_dir" ]]; then
	    echo "指定的目录 $rpm_dir 不存在或不可访问。"
	    exit 1
	fi

	# 获取指定目录下所有的 rpm 文件
	rpm_files=("$rpm_dir"/*.rpm)

	# 检查是否有 RPM 文件
	if [[ ${#rpm_files[@]} -eq 0 ]]; then
	    echo "在目录 $rpm_dir 中未找到 RPM 包。"
	    exit 1
	fi

    
	for rpm_file in "${rpm_files[@]}"; do
	if [[ -f "$rpm_file" ]]; then
	    # 安装 RPM 包
	    rpm -ivh "$rpm_file"
	    # 检查 RPM 安装命令的返回值
	    if [[ $? -eq 0 ]]; then
		successfully_installed=$((successfully_installed + 1))
	    fi
	fi
	done


	

	# 检查两次打包失败次数
	if [ "$current_failure_count" -eq "$last_failure_count" ]; then
	echo "两次打包失败次数相同，停止循环。"
	break
	fi

	last_failure_count=$current_failure_count  # 更新上次失败计数
	echo "第 $attempt 次循环处理完成，当前失败次数：$current_failure_count"
done

echo "达到了最大循环编译、安装次数，或所有文件处理完成。"